home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FishMarket 1.0
/
FishMarket v1.0.iso
/
fishies
/
551-575
/
disk_570
/
gadtoolsbox
/
source
/
source.lha
/
func.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-11-04
|
24KB
|
891 lines
/*-- AutoRev header do NOT edit!
*
* Program : func.c
* Copyright : © Copyright 1991 Jaba Development
* Author : Jan van den Baard
* Creation Date : 21-Sep-91
* Current version : 1.00
* Translator : DICE v2.6
*
* REVISION HISTORY
*
* Date Version Comment
* --------- ------- ------------------------------------------
* 21-Sep-91 1.00 Several functions.
*
*-- REV_END --*/
#include "GTEd.h"
#include "Protos.h"
/*
* Refrenced external global data.
*/
extern ULONG Class;
extern UWORD Qualifier, Code;
extern APTR Object, MainVisualInfo;
extern struct TextAttr MainFont;
extern struct MemoryChain *Misc, *Chain;
extern struct Screen *MainScreen;
extern struct Window *MainWindow;
extern struct RastPort *MainRP;
extern struct ExtGadgetList Gadgets;
extern struct Gadget *MainGList;
extern struct TagItem MainSTags[];
extern struct Screen *MainScreen;
extern BOOL WBenchClose;
extern UBYTE MainWBStatus[20], MainFileName[512];
extern struct ExtGadgetList Gadgets;
extern UWORD CountFrom;
extern UBYTE *MainExtension;
extern struct StringExtend Sextend;
extern BOOL GadgetsOn;
extern struct Gadget *MainGList;
extern struct TagItem nwTags[];
extern struct NewMenu Menus[];
extern struct Menu *MainMenus;
extern struct TextAttr Topaz80;
extern BOOL BreakDRAG;
extern struct Prefs MainPrefs;
extern struct IntuiText *WindowTxt;
extern BOOL Saved;
extern UWORD AlertCol;
extern UBYTE bi_SFile[], bi_LFile[];
/*
* --- Reads a message from the window message port.
* --- Returns TRUE if a message was read and puts the
* --- message data in the globals. Return FALSE if there
* --- was no message at the port.
*/
long ReadIMsg( struct Window *iwnd )
{
struct IntuiMessage *imsg;
if ( imsg = GT_GetIMsg( iwnd->UserPort )) {
Class = imsg->Class;
Qualifier = imsg->Qualifier;
Code = imsg->Code;
Object = imsg->IAddress;
if ( Class == IDCMP_MENUVERIFY )
MouseMove( MainWindow, FALSE );
GT_ReplyIMsg( imsg );
return TRUE;
}
return FALSE;
}
/*
* --- Clears all message from a message port.
*/
void ClearMsgPort( struct MsgPort *mport )
{
struct IntuiMessage *msg;
while ( msg = GT_GetIMsg( mport )) GT_ReplyIMsg( msg );
}
/*
* --- Create a node with a special userdata field used
* --- for the listview gadgets of the program. The allocated
* --- node also makes 100 bytes room for the node name.
*/
struct ListViewNode *MakeNode( UBYTE *name )
{
struct ListViewNode *node;
if ( node = ( struct ListViewNode * )AllocItem( Misc, (long)sizeof( struct ListViewNode ), MEMF_PUBLIC )) {
node->ln_Name = &node->ln_NameBytes[0];
strcpy( &node->ln_NameBytes[0], name );
return( node );
}
return( NULL );
}
/*
* --- Find node 'entry' in list 'list' and
* --- return a pointer to it.
*/
struct ListViewNode *FindNode( struct List *list , long entry )
{
struct ListViewNode *node;
long num;
for ( node = ( struct ListViewNode * )list->lh_Head, num = 0; num != entry; num++, node = node->ln_Succ );
return( node );
}
/*
* --- Free a complete list of nodes allocated with MakeNode();
*/
void FreeList( struct List *list )
{
struct ListViewNode *node;
while ( node = ( struct ListViewNode * )RemHead( list ))
FreeItem( Misc, node, (long)sizeof( struct ListViewNode ));
}
/*
* --- Read the current mouse coordinates. This
* --- routines also gives correct coordinates
* --- on GIMMEZEROZERO windows.
*/
void GetMouseXY( UWORD *x, UWORD *y )
{
ULONG wflg;
Forbid();
wflg = MainWindow->Flags;
Permit();
if (( wflg & WFLG_GIMMEZEROZERO ) == WFLG_GIMMEZEROZERO ) {
*x = MainWindow->GZZMouseX;
*y = MainWindow->GZZMouseY;
} else {
*x = MainWindow->MouseX;
*y = MainWindow->MouseY;
}
}
/*
* --- Draw a complemented box in the window.
*/
void Box( UWORD x, UWORD y, UWORD x1, UWORD y1 )
{
UWORD tmp;
if ( x > x1 ) { tmp = x; x = x1; x1 = tmp; }
if ( y > y1 ) { tmp = y; y = y1; y1 = tmp; }
SetDrMd( MainRP, JAM1 + COMPLEMENT );
Move( MainRP, x + 1, y );
Draw( MainRP, x1, y );
Draw( MainRP, x1, y1 );
Draw( MainRP, x, y1 );
Draw( MainRP, x, y );
}
/*
* --- Allocate a TagItem array.
*/
struct TagItem *MakeTagList( long numtags )
{
struct TagItem *tags;
if ( tags = ( struct TagItem * )AllocItem( Chain, (long)( sizeof( struct TagItem ) * ( numtags + 1 )), MEMF_PUBLIC )) {
tags[ numtags ].ti_Tag = TAG_DONE;
return( tags );
}
return NULL;
}
/*
* --- Set the Tag data of a Tag in a TagItem array.
*/
long SetTagData( struct TagItem *tags, Tag tag, Tag data )
{
while ( tags->ti_Tag != tag ) {
if ( tags->ti_Tag == TAG_DONE )
return FALSE;
tags++;
}
tags->ti_Data = data;
return TRUE;
}
/*
* --- Find the Tag in a TagItem array.
* --- The original TagInArray scans the data too which
* --- results in a TAG_DONE when the data is 0. I don't want this.
*/
long MyTagInArray( Tag tag, struct TagItem *tags )
{
while ( tags->ti_Tag != tag ) {
if ( tags->ti_Tag == TAG_DONE )
return FALSE;
tags++;
}
return TRUE;
}
/*
* --- Deallocate a TagItem array.
*/
void FreeTagList( struct TagItem *tags, long numtags )
{
FreeItem( Chain, tags, (long)( sizeof( struct TagItem ) * ( numtags + 1 )));
}
/*
* --- Wait for the user to either click on a gadget or press ESC.
*/
struct Gadget *WaitForGadget( struct Window *wnd )
{
struct Gadget *g;
BOOL mm = FALSE;
mm = MouseMove( wnd, FALSE );
while ( 1 ) {
WaitPort( wnd->UserPort );
while( ReadIMsg( wnd )) {
if ( Class == IDCMP_RAWKEY && Code == 0x45 ) {
ClearMsgPort( wnd->UserPort );
return NULL;
} else if ( Class == IDCMP_GADGETUP || Class == IDCMP_GADGETDOWN ) {
g = ( struct Gadget * )Object;
goto check;
}
}
}
check:
if ( Class == IDCMP_GADGETDOWN ) {
while( Code != SELECTUP ) {
while ( ReadIMsg( wnd ));
}
}
ClearMsgPort( wnd->UserPort );
if ( mm ) MouseMove( wnd, TRUE );
return( g );
}
/*
* --- (Re)Open the screen. This routine opens the
* --- used font found in the TextAttr structure MainFont
* --- because GadTools seems to need to be able to open the font
* --- using OpenFont() to make some gadgets (Integer & String).
* --- To let gadtools be able to OpenFont() the font it has
* --- to be in memory first. So by opening the font before the
* --- screen is opened the font is in memory and openable with
* --- OpenFont(). The routine closes the font as soon as all
* --- gadgets are created. It took me quite a while to figure this
* --- out because I could write and read a binary OK. But when I
* --- try'ed to load the same binary the next day GadTools would refuse
* --- to create the gadgets in the file! And then it struck me......
* --- The screen did not use the font specified in the file!!!!!
*/
long ReOpenScreen( long wnd )
{
struct TextFont *tf = 0l;
long mm = FALSE;
if ( MainWindow ) {
mm = MouseMove( MainWindow, FALSE );
if ( MainMenus ) {
ClearMenuStrip( MainWindow );
FreeMenus( MainMenus );
BreakDRAG = TRUE;
MainMenus = 0l;
}
RemoveAllGadgets();
if ( NOT wnd ) {
nwTags[0].ti_Data = (Tag)MainWindow->LeftEdge;
nwTags[1].ti_Data = (Tag)MainWindow->TopEdge;
nwTags[2].ti_Data = (Tag)MainWindow->Width;
nwTags[3].ti_Data = (Tag)MainWindow->Height;
} else if ( wnd == TRUE ) {
nwTags[0].ti_Data = 10l;
nwTags[1].ti_Data = 15l;
nwTags[2].ti_Data = 200l;
nwTags[3].ti_Data = 50l;
}
CloseWindow( MainWindow );
MainWindow = 0l;
}
if ( ModeNotAvailable( MainSTags[5].ti_Data )) {
MyRequest( "Hello, hello..", "OK", "File uses monitor that isn't available.\n I will use the default monitor!" );
MainSTags[5].ti_Data = DEFAULT_MONITOR_ID | HIRES_KEY;
}
if ( NOT( tf = OpenDiskFont( &MainFont )))
CopyMem(( char *)&Topaz80, (char *)&MainFont, (long)sizeof( struct TextAttr ));
if ( MainScreen ) {
FreeScreenInfo( MainScreen );
CloseScreen( MainScreen );
MainScreen = 0l;
}
if ( NOT( MainScreen = OpenScreenTagList( 0l, MainSTags )))
return FALSE;
if( NOT GetScreenInfo( MainScreen ))
return FALSE;
nwTags[7 ].ti_Data = (Tag)MainScreen;
nwTags[10].ti_Data = (Tag)MainScreen->Width;
nwTags[11].ti_Data = (Tag)MainScreen->Height;
if ( NOT( MainWindow = OpenWindowTagList( 0l, nwTags )))
return FALSE;
SetMouseQueue( MainWindow, 1l );
if ( mm ) MouseMove( MainWindow, TRUE );
if ( NOT( MainMenus = CreateMenus( Menus, GTMN_FrontPen, 0l, TAG_DONE )))
return FALSE;
MainRP = MainWindow->RPort;
LayoutMenus( MainMenus, MainVisualInfo, GTMN_TextAttr, &Topaz80, TAG_DONE );
SetMenuStrip( MainWindow, MainMenus );
if ( tf )
CloseFont( tf );
return( RemakeAllGadgets());
}
/*
* --- Open/Close workbench screen.
*/
void DoWBench( void )
{
if ( NOT WBenchClose ) {
if ( CloseWorkBench()) {
WBenchClose = TRUE;
Forbid();
strcpy( MainWBStatus, "Open Workbench" );
Permit();
return;
} else
MyRequest( "GadToolsBox message:", "CONTINUE", "Can't close the Workbench !" );
} else {
if( OpenWorkBench()) {
WBenchClose = FALSE;
Forbid();
strcpy( MainWBStatus, "Close Workbench" );
Permit();
ScreenToFront( MainScreen );
return;
} else
MyRequest( "GadToolsBox message:", "CONTINUE", "Can't open the Workbench !" );
}
}
/*
* --- This routine looks through the list to find
* --- the ExtNewGadget structure of the gadget.
*/
struct ExtNewGadget *FindExtGad( struct Gadget *gadget )
{
struct ExtNewGadget *eng;
eng = Gadgets.gl_First;
while ( eng ) {
if ( eng->en_Gadget == gadget ) break;
eng = eng->en_Next;
}
return( eng );
}
/*
* --- Renumber all gadget ID's and update the
* --- non user labels.
*/
void Renumber( void )
{
struct ExtNewGadget *eng;
UWORD id = CountFrom;
for ( eng = Gadgets.gl_First; eng->en_Next; eng = eng->en_Next ) {
if (( eng->en_SpecialFlags & EGF_USERLABEL ) != EGF_USERLABEL )
sprintf( &eng->en_SourceLabel[0], "Gadget%ld", id - CountFrom );
eng->en_NewGadget.ng_GadgetID = id++;
}
}
/*
* --- Append ".G" to the filename if it isn't there.
*/
void CheckSuffix( void )
{
UBYTE buf[10];
UWORD len;
if ( strlen( bi_SFile )) {
len = strlen( MainFileName ) - 2;
strcpy( buf, &MainFileName[ len ] );
if ( NOT Stricmp( buf, MainExtension ))
return;
strcat( MainFileName, MainExtension );
strcat( bi_SFile, MainExtension );
strcat( bi_LFile, MainExtension );
}
}
/*
* --- Attach a StringExtend structure to a string gadget.
*/
void SetStringGadget( struct Gadget *g )
{
struct StringInfo *si;
si = ( struct StringInfo * )g->SpecialInfo;
g->Activation |= GACT_STRINGEXTEND;
si->Extension = &Sextend;
}
/*
* --- Remove all gadgets from the window to
* --- let the program change the contents and list.
*/
void RemoveAllGadgets( void )
{
if ( MainGList ) {
if ( GadgetsOn ) {
RemoveGList( MainWindow, MainGList, -1l );
GadgetsOn = FALSE;
}
FreeGadgets( MainGList );
MainGList = 0l;
}
}
/*
* --- Re-create all gadgets in the list.
*/
long RemakeAllGadgets( void )
{
struct ExtNewGadget *eng;
struct Gadget *g, *lock;
ClearWindow();
if ( g = CreateContext( &MainGList )) {
for ( eng = Gadgets.gl_First; eng->en_Next; eng = eng->en_Next ) {
eng->en_NewGadget.ng_TextAttr = &MainFont;
eng->en_NewGadget.ng_VisualInfo = MainVisualInfo;
SizeAGadget( eng );
if (( eng->en_SpecialFlags & EGF_NEEDLOCK ) == EGF_NEEDLOCK )
SetTagData( eng->en_Tags, GTLV_ShowSelected, (Tag)eng->en_Prev->en_Gadget );
g = CreateGadgetA( eng->en_Kind, g, &eng->en_NewGadget, eng->en_Tags );
eng->en_Gadget = g;
}
if ( g ) {
AddGList( MainWindow, MainGList, -1l, -1l, 0l );
RefreshWindow();
GadgetsOn = TRUE;
return TRUE;
}
}
MyRequest( "Oh oh...", "CONTINUE", "BIG TROUBLE!\nCould not create the gadgets !" );
return FALSE;
}
/*
* --- Deallocate a ExtNewGadget structure plus
* --- any additional memory a specific kind
* --- of gadget takes up.
*/
void FreeExtGad( struct ExtNewGadget *eng )
{
UWORD cnt;
if ( eng->en_Tags )
FreeTagList( eng->en_Tags, eng->en_NumTags );
switch( eng->en_Kind ) {
case STRING_KIND:
if ( eng->en_DefString )
FreeItem( Chain, eng->en_DefString, (long)strlen( eng->en_DefString ) + 1 );
break;
case LISTVIEW_KIND:
FreeList( &eng->en_Entries );
break;
case MX_KIND:
case CYCLE_KIND:
for ( cnt = 0; cnt < 23; cnt++ ) {
if ( eng->en_Labels[ cnt ] )
FreeItem( Chain, eng->en_Labels[ cnt ], strlen( eng->en_Labels[ cnt ] ) + 1 );
}
break;
case SLIDER_KIND:
if ( eng->en_LevelFormat )
FreeItem( Chain, eng->en_LevelFormat, (long)strlen( eng->en_LevelFormat ) + 1 );
break;
}
FreeItem( Chain, eng, (long)sizeof( struct ExtNewGadget ));
}
/*
* --- Switch on/off the WFLG_REPORTMOUSE flags.
* --- (Not using ReportMouse())
*/
long MouseMove( struct Window *wnd, long on )
{
if ( NOT on ) {
Forbid();
if (( wnd->Flags & WFLG_REPORTMOUSE ) == WFLG_REPORTMOUSE ) {
wnd->Flags &= ~WFLG_REPORTMOUSE;
Permit();
return TRUE;
}
Permit();
return FALSE;
} else {
Forbid();
wnd->Flags |= WFLG_REPORTMOUSE;
Permit();
if (( MainPrefs.pr_PrefFlags0 & PRF_COORDS ) == PRF_COORDS )
UpdateCoords( 0l, 0, 0, 0, 0 );
return TRUE;
}
}
/*
* --- FlipFlop a boolean and checkbox gadget ( if specified )
*/
void FlipFlop( struct Window *wnd, struct Gadget **list, long index, BOOL *val )
{
if ( *val ) *val = FALSE;
else *val = TRUE;
if ( list )
GT_SetGadgetAttrs( list[ index ], wnd, 0l, GTCB_Checked, (Tag)*val, TAG_DONE );
}
/*
* --- EnableGadget a gadget ( if specified )
*/
void EnableGadget( struct Window *wnd, struct Gadget **list, long index, BOOL val )
{
BOOL off;
if ( val ) off = FALSE;
else off = TRUE;
GT_SetGadgetAttrs( list[ index ], wnd, 0l, GA_Disabled, (Tag)off, TAG_DONE );
}
/*
* --- Convert ListViewNodes to gadget labels.
*/
long ListToLabels( struct List *list, struct ExtNewGadget *eng )
{
struct ListViewNode *node;
UWORD cnt, num = 0;
setmem(( void * )&eng->en_Labels[0], 100l, 0l );
for ( node = list->lh_Head, cnt = 0; node->ln_Succ; node = node->ln_Succ, cnt++ ) {
if ( eng->en_Labels[ cnt ] = AllocItem( Chain, strlen( &node->ln_NameBytes[0] ) + 1, MEMF_PUBLIC )) {
strcpy( eng->en_Labels[ cnt ], &node->ln_NameBytes[0] );
num++;
} else {
FreeList( list );
return FALSE;
}
}
FreeList( list );
return((long) num );
}
/*
* --- Convert gadget labels to ListViewNodes.
*/
long LabelsToList( struct List *list, struct ExtNewGadget *eng )
{
struct ListViewNode *node;
UWORD cnt, num = 0;
NewList( list );
for ( cnt = 0; cnt < 24; cnt ++ ) {
if ( eng->en_Labels[ cnt ] ) {
if ( node = MakeNode( eng->en_Labels[ cnt ] )) {
AddTail( list, ( struct Node * )node );
FreeItem( Chain, eng->en_Labels[ cnt ], strlen( eng->en_Labels[ cnt ] ) + 1 );
eng->en_Labels[ cnt ] = 0l;
num++;
} else {
FreeList( list );
return FALSE;
}
}
}
return((long)num);
}
/*
* --- Size the gadget to it's minimum width when to small.
*/
void SizeAGadget( struct ExtNewGadget *eng )
{
struct NewGadget *ng = &eng->en_NewGadget;
switch( eng->en_Kind ) {
case BUTTON_KIND:
case CYCLE_KIND:
if ( ng->ng_Width < ( MainScreen->RastPort.TxWidth + 8 ))
ng->ng_Width = MainScreen->RastPort.TxWidth + 8;
if ( ng->ng_Height < ( MainScreen->RastPort.TxHeight + 3 ))
ng->ng_Height = MainScreen->RastPort.TxHeight + 3;
break;
case INTEGER_KIND:
case STRING_KIND:
if ( ng->ng_Width < ( MainScreen->RastPort.TxWidth + 13 ))
ng->ng_Width = MainScreen->RastPort.TxWidth + 13;
if ( ng->ng_Height < ( MainScreen->RastPort.TxHeight + 4 ))
ng->ng_Height = MainScreen->RastPort.TxHeight + 4;
if ( eng->en_Kind == STRING_KIND ) {
if (( eng->en_SpecialFlags & EGF_ISLOCKED ) == EGF_ISLOCKED )
eng->en_NewGadget.ng_Width = eng->en_Next->en_NewGadget.ng_Width;
}
break;
case LISTVIEW_KIND:
if ( eng->en_ScrollWidth ) {
if ( ng->ng_Width < ( eng->en_ScrollWidth + 14 ))
ng->ng_Width = eng->en_ScrollWidth + 14;
} else {
if ( ng->ng_Width < 30 )
ng->ng_Width = 30;
}
if ( ng->ng_Height < (( MainScreen->RastPort.TxHeight << 1 ) + 9 ))
ng->ng_Height = ( MainScreen->RastPort.TxHeight << 1 ) + 9;
break;
case PALETTE_KIND:
if ( MyTagInArray( GTPA_IndicatorWidth, eng->en_Tags )) {
if ( ng->ng_Width < ( eng->en_IndicatorSize + 20 ))
ng->ng_Width = eng->en_IndicatorSize + 20;
if ( ng->ng_Height < 20 )
ng->ng_Height = 20;
} else {
if ( ng->ng_Width < 20 )
ng->ng_Width = 20;
if ( ng->ng_Height < (( eng->en_IndicatorSize >> 1 ) + 20 ))
ng->ng_Height = ( eng->en_IndicatorSize >> 1 ) + 20;
}
break;
case SCROLLER_KIND:
if ( NOT MyTagInArray( PGA_Freedom, eng->en_Tags )) {
if ( ng->ng_Width < (( eng->en_ArrowSize << 1 ) + 10 ))
ng->ng_Width = ( eng->en_ArrowSize << 1 ) + 10;
if ( ng->ng_Height < 8)
ng->ng_Height = 8;
} else {
if ( ng->ng_Width < 10 )
ng->ng_Width = 10;
if ( ng->ng_Height < ((eng->en_ArrowSize << 1) + 10 ))
ng->ng_Height = (eng->en_ArrowSize << 1) + 10;
}
break;
case SLIDER_KIND:
if ( ng->ng_Width < 12 ) ng->ng_Width = 12;
if ( ng->ng_Height < 8 ) ng->ng_Height = 8;
break;
}
}
/*
* --- Copy the contents of one list to another.
*/
long CopyList( struct ExtNewGadget *src, struct ExtNewGadget *dst )
{
struct ListViewNode *node, *tmp;
NewList( &dst->en_Entries );
for( tmp = src->en_Entries.lh_Head; tmp->ln_Succ; tmp = tmp->ln_Succ ) {
if( node = MakeNode( tmp->ln_Name )) {
node->ln_UserData[0] = tmp->ln_UserData[0];
AddTail( &dst->en_Entries, ( struct Node * )node);
} else
return FALSE;
}
SetTagData( dst->en_Tags, GTLV_Labels, (Tag)&dst->en_Entries );
return TRUE;
}
/*
* --- Copy the labels of one gadget to another.
*/
long CopyLabels( struct ExtNewGadget *src, struct ExtNewGadget *dst, long t )
{
UWORD cnt;
for ( cnt = 0; cnt < 24; cnt ++ ) {
if ( src->en_Labels[ cnt ] ) {
if ( dst->en_Labels[ cnt ] = AllocItem( Chain, (long)strlen( src->en_Labels[ cnt ] ) + 1, MEMF_PUBLIC ))
strcpy( dst->en_Labels[ cnt ], src->en_Labels[ cnt ] );
else
return FALSE;
}
}
if ( t ) SetTagData( dst->en_Tags, GTMX_Labels, (Tag)&dst->en_Labels[0] );
else SetTagData( dst->en_Tags, GTCY_Labels, (Tag)&dst->en_Labels[0] );
return TRUE;
}
/*
* --- Check for a file existance. If it exists put a requester up
* --- and ask to over write when mode if MODE_NEWFILE.
*/
BPTR MyOpen( long mode )
{
BPTR file;
long rc = TRUE;
if ( mode == MODE_NEWFILE ) {
if ( file = Open( MainFileName, MODE_OLDFILE )) {
AlertUser( TRUE );
rc = MyRequest( "Excuse me...", "YEP|NOOOO..", "---> %s <---\n\nFile already exists !\nOverwrite it ?", MainFileName );
AlertUser( FALSE );
Close( file );
}
}
if ( rc ) return ( Open( MainFileName, mode ));
return( NULL );
}
/*
* --- Delete all gadgets.
*/
void DeleteAllGadgets( void )
{
struct ExtNewGadget *eng;
RemoveAllGadgets();
while ( eng = ( struct ExtNewGadget * )RemHead(( struct List * )&Gadgets ))
FreeExtGad( eng );
NewList(( struct List * )&Gadgets );
}
/*
* --- Check if a '/' or a ':' is appended to the dirname.
*/
void CheckDirExtension( void )
{
UWORD len = strlen( MainFileName );
if ( len ) {
len--;
if ( MainFileName[ len ] != '/' && MainFileName[ len ] != ':' )
strcat( MainFileName, "/" );
}
}
/*
* --- Refresh the window.
*/
void RefreshWindow( void )
{
RefreshWindowFrame( MainWindow );
if ( MainGList ) {
RefreshGList( MainGList, MainWindow, 0l, -1l );
GT_RefreshWindow( MainWindow, 0l );
}
if ( WindowTxt )
PrintIText( MainRP, WindowTxt, 0l, 0l );
}
/*
* --- (Re)Set the allert color.
*/
void AlertUser( long how )
{
if ( how ) {
AlertCol = GetRGB4( MainScreen->ViewPort.ColorMap, 0l );
SetRGB4( &MainScreen->ViewPort, 0l, 0x0F, 0x08, 0x06 );
} else
LoadRGB4( &MainScreen->ViewPort, &AlertCol, 2l );
}
/*
* --- Quit the program.
*/
void Quit( void )
{
if ( NOT Saved ) {
AlertUser( TRUE );
if ( MyRequest( "!!! RED ALERT !!!", "Go Ahead|Nooooo!!!","Changes not saved !\n Quit anyway ?" ))
goto quit;
} else {
AlertUser( TRUE );
if ( MyRequest( "Specify...", "YES|NO", " Are you sure\nYou want to quit?"))
goto quit;
}
AlertUser( FALSE );
return;
quit:
QuitProgram( 0l );
}
/*
* --- Perform formatted output to a file.
*/
long MyFPrintf( BPTR fh, UBYTE *format, ... )
{
va_list args;
long ret;
va_start( args, format );
ret = VFPrintf( fh, format, args );
va_end( args );
return( ret );
}
/*
* Count the gadgets in the list.
*/
long CountGadgets( void )
{
struct ExtNewGadget *eng;
long num;
for ( eng = Gadgets.gl_First, num = 0l; eng->en_Next; eng = eng->en_Next, num++ );
return( num );
}